instead of just passing the node.
This allows us to extend watches to have additional arguments (like domids).
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
};
/* React to a change in the target key */
-static void watch_target(struct xenbus_watch *watch, const char *node)
+static void watch_target(struct xenbus_watch *watch,
+ const char **vec, unsigned int len)
{
unsigned long long new_target;
int err;
}
/* Front end tells us frame. */
-static void frontend_changed(struct xenbus_watch *watch, const char *node)
+static void frontend_changed(struct xenbus_watch *watch,
+ const char **vec, unsigned int len)
{
unsigned long ring_ref;
unsigned int evtchn;
= container_of(watch, struct backend_info, watch);
/* If other end is gone, delete ourself. */
- if (node && !xenbus_exists(be->frontpath, "")) {
+ if (vec && !xenbus_exists(be->frontpath, "")) {
device_unregister(&be->dev->dev);
return;
}
We provide event channel and device details to front end.
Frontend supplies shared frame and event channel.
*/
-static void backend_changed(struct xenbus_watch *watch, const char *node)
+static void backend_changed(struct xenbus_watch *watch,
+ const char **vec, unsigned int len)
{
int err;
char *p;
}
/* Pass in NULL node to skip exist test. */
- frontend_changed(&be->watch, NULL);
+ frontend_changed(&be->watch, NULL, 0);
}
}
{ "" }
};
-static void watch_for_status(struct xenbus_watch *watch, const char *node)
+static void watch_for_status(struct xenbus_watch *watch,
+ const char **vec, unsigned int len)
{
struct blkfront_info *info;
unsigned int binfo;
unsigned long sectors, sector_size;
int err;
+ const char *node;
+
+ node = vec[XS_WATCH_PATH];
info = container_of(watch, struct blkfront_info, watch);
node += strlen(watch->node);
return err;
}
- /* Call once in case entries already there. */
- watch_for_status(&info->watch, info->watch.node);
+ {
+ unsigned int len = max(XS_WATCH_PATH, XS_WATCH_TOKEN) + 1;
+ const char *vec[len];
+
+ vec[XS_WATCH_PATH] = info->watch.node;
+ vec[XS_WATCH_TOKEN] = NULL;
+
+ /* Call once in case entries already there. */
+ watch_for_status(&info->watch, vec, len);
+ }
+
return 0;
}
}
/* Front end tells us frame. */
-static void frontend_changed(struct xenbus_watch *watch, const char *node)
+static void frontend_changed(struct xenbus_watch *watch,
+ const char **vec, unsigned int len)
{
unsigned long ring_ref;
unsigned int evtchn;
= container_of(watch, struct backend_info, watch);
/* If other end is gone, delete ourself. */
- if (node && !xenbus_exists(be->frontpath, "")) {
+ if (vec && !xenbus_exists(be->frontpath, "")) {
xenbus_rm(be->dev->nodename, "");
device_unregister(&be->dev->dev);
return;
We provide event channel and device details to front end.
Frontend supplies shared frame and event channel.
*/
-static void backend_changed(struct xenbus_watch *watch, const char *node)
+static void backend_changed(struct xenbus_watch *watch,
+ const char **vec, unsigned int len)
{
int err;
char *p;
}
/* Pass in NULL node to skip exist test. */
- frontend_changed(&be->watch, NULL);
+ frontend_changed(&be->watch, NULL, 0);
}
}
}
/* Front end tells us frame. */
-static void frontend_changed(struct xenbus_watch *watch, const char *node)
+static void frontend_changed(struct xenbus_watch *watch,
+ const char **vec, unsigned int len)
{
unsigned long tx_ring_ref, rx_ring_ref;
unsigned int evtchn;
int i;
/* If other end is gone, delete ourself. */
- if (node && !xenbus_exists(be->frontpath, "")) {
+ if (vec && !xenbus_exists(be->frontpath, "")) {
xenbus_rm(be->dev->nodename, "");
device_unregister(&be->dev->dev);
return;
We provide event channel and device details to front end.
Frontend supplies shared frame and event channel.
*/
-static void backend_changed(struct xenbus_watch *watch, const char *node)
+static void backend_changed(struct xenbus_watch *watch,
+ const char **vec, unsigned int len)
{
int err;
long int handle;
kobject_hotplug(&dev->dev.kobj, KOBJ_ONLINE);
/* Pass in NULL node to skip exist test. */
- frontend_changed(&be->watch, NULL);
+ frontend_changed(&be->watch, NULL, 0);
}
}
{ "" }
};
-static void watch_for_status(struct xenbus_watch *watch, const char *node)
+static void watch_for_status(struct xenbus_watch *watch,
+ const char **vec, unsigned int len)
{
}
}
-static void frontend_changed(struct xenbus_watch *watch, const char *node)
+static void frontend_changed(struct xenbus_watch *watch,
+ const char **vec, unsigned int len)
{
unsigned long ringref;
unsigned int evtchn;
= container_of(watch, struct backend_info, watch);
/* If other end is gone, delete ourself. */
- if (node && !xenbus_exists(be->frontpath, "")) {
+ if (vec && !xenbus_exists(be->frontpath, "")) {
xenbus_rm(be->dev->nodename, "");
device_unregister(&be->dev->dev);
return;
}
-static void backend_changed(struct xenbus_watch *watch, const char *node)
+static void backend_changed(struct xenbus_watch *watch,
+ const char **vec, unsigned int len)
{
int err;
long int instance;
be->instance = instance;
if (be->tpmif == NULL) {
+ unsigned int len = max(XS_WATCH_PATH, XS_WATCH_TOKEN) + 1;
+ const char *vec[len];
+
be->tpmif = tpmif_find(be->frontend_id,
instance);
if (IS_ERR(be->tpmif)) {
return;
}
+ vec[XS_WATCH_PATH] = be->frontpath;
+ vec[XS_WATCH_TOKEN] = NULL;
+
/* Pass in NULL node to skip exist test. */
- frontend_changed(&be->watch, be->frontpath);
+ frontend_changed(&be->watch, vec, len);
}
}
XENBUS support code
**************************************************************/
-static void watch_for_status(struct xenbus_watch *watch, const char *node)
+static void watch_for_status(struct xenbus_watch *watch,
+ const char **vec, unsigned int len)
{
struct tpmfront_info *info;
int err;
unsigned long ready;
struct tpm_private *tp = &my_private;
+ const char *node = vec[XS_WATCH_PATH];
info = container_of(watch, struct tpmfront_info, watch);
node += strlen(watch->node);
kfree(root);
}
-static void frontend_changed(struct xenbus_watch *watch, const char *node)
+static void frontend_changed(struct xenbus_watch *watch,
+ const char **vec, unsigned int len)
{
- dev_changed(node, &xenbus_frontend);
+ dev_changed(vec[XS_WATCH_PATH], &xenbus_frontend);
}
-static void backend_changed(struct xenbus_watch *watch, const char *node)
+static void backend_changed(struct xenbus_watch *watch,
+ const char **vec, unsigned int len)
{
- dev_changed(node, &xenbus_backend);
+ dev_changed(vec[XS_WATCH_PATH], &xenbus_backend);
}
/* We watch for devices appearing and vanishing. */
vec[XS_WATCH_TOKEN], err);
w = find_watch(vec[XS_WATCH_TOKEN]);
BUG_ON(!w);
- w->callback(w, vec[XS_WATCH_PATH]);
+ w->callback(w, (const char **)vec, num);
kfree(vec);
} else if (vec)
printk(KERN_WARNING "XENBUS xs_read_watch: %li\n",
#include <linux/notifier.h>
#include <asm/semaphore.h>
+/* FIXME there's got to be a better way to get at the XS_WATCH macros */
+#include <asm-xen/linux-public/xenstored.h>
+
/* A xenbus device. */
struct xenbus_device {
char *devicetype;
{
struct list_head list;
char *node;
- void (*callback)(struct xenbus_watch *, const char *node);
+ void (*callback)(struct xenbus_watch *,
+ const char **vec, unsigned int len);
};
/* notifer routines for when the xenstore comes up */